package com.gengzp.mq.server.mapper;

import com.gengzp.mq.server.model.message.entity.MqMessage;
import com.gengzp.mq.server.model.message.req.MqPageMessageReq;
import org.apache.ibatis.annotations.Param;
import org.mybatis.spring.annotation.MapperScan;

import java.util.List;

/**
 * @ClassName MqMessageMapper
 * @Description
 * @Author gengzp
 * @Date 2025/9/3 17:28
 */
@MapperScan
public interface MqMessageMapper {

    /**
     * 根据topic查询最早的未消费存量消息
     *
     * @param topic 主题
     * @return 最早的未消费存量消息
     */
    MqMessage selectOldestUnConsumedMessageByTopic(@Param("topic") String topic);

    /**
     * 根据消息id查询消息
     *
     * @param messageId 消息id
     * @return 消息
     */
    MqMessage selectMqMessageById(@Param("messageId") String messageId);

    /**
     * 根据消息id集合批量查询消息
     *
     * @param messageIds 消息id集合
     * @return 消息集合
     */
    List<MqMessage> selectMqMessagesByIds(@Param("messageIds") List<String> messageIds);

    /**
     * 根据消息id集合批量查询已经消费成功的消息
     *
     * @param messageIds 消息id集合
     * @return 消息集合
     */
    List<MqMessage> selectConsumedSuccessMqMessagesByIds(@Param("messageIds") List<String> messageIds);

    /**
     * 查询所有过时消息id
     * <p> 非死信的, 且发送时间距离当前系统时间超过 14 天的消息 </p>
     *
     * @param currentTimeMillis 当前时间戳
     * @return 过时消息id集合
     */
    List<String> selectAllObsoleteMessageIds(@Param("currentTimeMillis") long currentTimeMillis);

    /**
     * 根据状态查询消息
     *
     * @param status 状态
     * @return 指定状态的消息集合
     */
    List<MqMessage> selectMessagesByStatus(@Param("status") Integer status);

    /**
     * 分页查询消息
     *
     * @param req 查询参数
     * @return 分页结果
     */
    List<MqMessage> pageQueryMessage(MqPageMessageReq req);

    /**
     * 查询消息总数
     *
     * @param req 查询参数
     * @return 消息总数
     */
    int pageQueryMessageCount(MqPageMessageReq req);

    /**
     * 插入一条消息
     *
     * @param mqMessage 消息实体
     */
    void insertMqMessage(MqMessage mqMessage);

    /**
     * 批量根据消息id修改消息状态
     *
     * @param messageIds 消息id集合
     * @param status     消息状态
     */
    void batchUpdateMessageStatusByIds(@Param("messageIds") List<String> messageIds,
                                       @Param("status") Integer status);

    /**
     * 根据id修改消息
     *
     * @param mqMessage 消息
     */
    void updateMessageById(MqMessage mqMessage);

    /**
     * 根据消息id修改状态
     *
     * @param messageId 消息id
     * @param status    状态
     */
    void updateMessageStatusById(@Param("messageId") String messageId,
                                 @Param("status") Integer status);

    /**
     * 根据id批量删除消息
     *
     * @param messageIds 消息id集合
     */
    void deleteMessageByIds(@Param("messageIds") List<String> messageIds);

}
